
import java.util.Iterator;
import java.util.LinkedList;

/**
 * 自定义链表
 */
public class DefLinkNode {

    /**
     * 1新增链表类
     * 2新增链表实例
     * 3新增链表节点：逐个从第一个节点开始加，并加上链表节点关系。
     * 4删除链表节点：删除任意一个节点，删除第一个节点
     * 5读取链表内容：读取所有节点的值
     * 6修改链表某个节点的值：修改任意一个节点的值
     * 7取链表的值：取任意一个节点的值
     * 8计算链表长度：从任意一个节点开始计算到末尾的长度
     * 9插入节点：从中间插入节点
     * @param args
     */
    public static void main(String[] args) {
        //链表的每个值就是一个节点，这个节点就是定义的链表类。
        //定义第一个链表节点
        LinkNode head=new LinkNode();//使用无参构造初始化
        head.val=2;//直接赋值
        System.out.println("第一个节点的值为"+head.val);

        //定义第二个链表节点:1.必须用第一个节点关联第二个节点  2.必须定义第二个节点的值
        LinkNode second=new LinkNode();
        second.val=3;
        head.next=second;
        System.out.println("第一个节点的下个节点为"+head.next+"  第二个节点的值为："+head.next.val);

        //计算链表长度:传第一个节点
        int length=getLength(head);
        System.out.println("链表长度为："+length);

        //计算链表长度：传第二个节点
        int smallLength=getLength(second);
        System.out.println("第二个节点到末尾节点有多长："+smallLength);


        //插入节点：在第一和第二节点间插入一个节点， 1.新建一个节点  2.断开第一和第二节点的关系   3.把新建的节点连上第一个节点   4.把最后一个节点连在新建的节点上
        LinkNode newNode=new LinkNode();
        newNode.val=4; //1.新建节点
        head.next=null;//2.断开第一个节点和第二个节点关系
        head.next=newNode;//3.把新建的节点连上第一个节点
        newNode.next=second;//4.把最后一个节点连在新建的节点上

       LinkNode current=head;//注意要从头开始
       String value="";
        while(current!=null){//注意这里不能直接传head,因为循环会改变head的位置
            value=value.concat(String.valueOf(current.val))+"  ";
            current=current.next;
        }
        System.out.println("插入节点后的值："+value);//把所有节点按顺序逐个打印出来

        //删除第二个节点
        head.next=null;
        newNode.next=null;
        head.next=second;
        String value2="";
        LinkNode current2=head;//注意要从头开始
        while(current2!=null){
            value2=value2.concat(String.valueOf(current2.val))+"  ";
            current2=current2.next;
        }
        System.out.println("删除第二个节点后的值"+value2);//把所有节点按顺序逐个打印出来


        //先在末尾加一个节点
        LinkNode third=new LinkNode();
        third.val=5;
        second.next=third;


        //删除链表第一个节点：1.断开第一个节点和第二个节点的连接，第二个节点和后续节点的连接依然不变。后续的还是一个链表。
        head.next=null;//剩余的节点就从newNode开始了
        String value3="";
        LinkNode current3=second;//因为删除了第一个链表，所以此处只有从second节点开始
        while(current3!=null){
            value3=value3.concat(String.valueOf(current3.val))+"  ";
            current3=current3.next;
        }
        System.out.println("删除第一个节点后的值"+value3);//把所有节点按顺序逐个打印出来


        //修改链表某个节点的值
        third.val=8;
        String value4="";
        LinkNode current4=second;//因为删除了第一个链表，所以此处只有从second节点开始
        while(current4!=null){
            value4=value4.concat(String.valueOf(current4.val))+"  ";
            current4=current4.next;
        }
        System.out.println("修改链表某个节点后的值"+value4);//把所有节点按顺序逐个打印出来

    }


    public static class LinkNode{
        private int val;//链表的值，可以定义为任意值，根据业务需求定，不一定是int
        private LinkNode next;//链表的每个元素都是属于一样的类
    }

    public static int getLength(LinkNode node){//这里传链表的一个节点，如果传的头节点就计算链表的长度，如果传的链表的中间某个节点，就从链表中间某个节点计算到末尾的长度
        int length=0;
        while(node!=null){
            length=length+1;
            node=node.next;

        }
        return length;
    }


}
